package com.ganzalang.gmall.command.inventory.factory;

import com.ganzalang.gmall.command.domain.ProductVariantInventory;
import com.ganzalang.gmall.command.inventory.updater.InventoryUpdater;
import com.ganzalang.gmall.command.service.ProductVariantInventoryService;
import org.springframework.context.ApplicationEventPublisher;

import java.util.List;

/**
 * @description: 库存更新命令的工厂的基类
 * @author: Ganzalang
 * @Date 2021/3/13 10:54
 */
public abstract class AbstractInventoryUpdaterFactory<T> implements InventoryUpdaterFactory<T>{

    /**
     * 商品库存service组件
     */
    protected ProductVariantInventoryService inventoryService;

    /**
     * 事件发布组件
     */
    protected ApplicationEventPublisher publisher;

    /**
     * 构造方法
     * @param inventoryService 商品库存service组件
     */
    public AbstractInventoryUpdaterFactory(
            ProductVariantInventoryService inventoryService,
            ApplicationEventPublisher publisher) {
        this.inventoryService = inventoryService;
        this.publisher = publisher;
    }

    /**
     * 创建库存更新命令
     * @param parameter 每个命令对应的参数
     * @return
     */
    @Override
    public InventoryUpdater create(T parameter) {
        //获取sku对应的库存集合
        List<ProductVariantInventory> productVariantInventories = createGoodsStockDOs(parameter);
        Long shopId = productVariantInventories.get(0).getShopId();
        //使用命令工厂实例化命令
        InventoryUpdater inventoryUpdater = create(productVariantInventories, parameter, shopId);
        return inventoryUpdater;
    }

    /**
     * 获取商品库存对象集合
     * @param parameter 每个命令对应的参数
     * @return sku ids集合
     */
    protected abstract List<ProductVariantInventory> createGoodsStockDOs(T parameter);

    /**
     * 创建库存更新命令
     * @param productVariantInventories 商品sku库存集合
     * @param parameter 每个命令对应的参数
     * @param shopId 店铺ID
     * @return 库存更新命令
     */
    protected abstract InventoryUpdater create(List<ProductVariantInventory> productVariantInventories, T parameter, Long shopId);
}
